#include "FreeRTOS.h"
#include "delay.h"
#include "hdl_auto_init.h"
#include "modbus_task.h"
#include "semphr.h"
#include "sys_monitor.h"
#include "task.h"

// 任务优先
#define START_TASK_PRIO 1
// 任务堆栈大小
#define START_STK_SIZE 128
// 任务句柄
TaskHandle_t StartTask_Handler;
// 任务函数
void start_task(void* pvParameters);

SemaphoreHandle_t MutexSemaphore = NULL; /* 互斥信号量 */

int main(void)
{

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);   // 设置系统中断优先级分组4
    delay_init(168);                                  // 初始化延时函数
    vhdl_board_init();
    // 创建开始任务
    xTaskCreate((TaskFunction_t)start_task,   // 任务函数
                (const char*)"start_task",    // 任务名称
                (uint16_t)START_STK_SIZE,     // 任务堆栈大小
                (void*)NULL,                  // 传递给任务函数的参数
                (UBaseType_t)START_TASK_PRIO,         // 任务优先级
                (TaskHandle_t*)&StartTask_Handler);   // 任务句柄
    vTaskStartScheduler();                            // 开启任务调度
}

// 开始任务任务函数
void start_task(void* pvParameters)
{
    taskENTER_CRITICAL();   // 进入临界区

    MutexSemaphore = xSemaphoreCreateMutex();

    // Modbus主机轮训线程
    xTaskCreate((TaskFunction_t)rtu_master_task,
                (const char*)"rtu_master",
                (uint16_t)RTU_MASTER_STK_SIZE,
                (void*)NULL,
                (UBaseType_t)RTU_MASTER_TASK_PRIO,
                (TaskHandle_t*)&RtuMasterTask_Handler);

    // Modbus从机轮训线程
    xTaskCreate((TaskFunction_t)rtu_slave_task,
                (const char*)"rtu_slave",
                (uint16_t)RTU_SLAVE_STK_SIZE,
                (void*)NULL,
                (UBaseType_t)RTU_SLAVE_TASK_PRIO,
                (TaskHandle_t*)RtuSlaveTask_Handler);

                
    // Modbus主机app线程测试
    xTaskCreate((TaskFunction_t)rtu_master_app_task,
                (const char*)"rtu_app_task",
                (uint16_t)RTU_MASTER_APP_STK_SIZE,
                (void*)NULL,
                (UBaseType_t)RTU_MASTER_APP_TASK_PRIO,
                (TaskHandle_t*)&RtuMasterAppTask_Handler);
                
    // 创建系统监控线程
    xTaskCreate((TaskFunction_t)system_monitor_task,
                (const char*)"SysMonitorTask",
                (uint16_t)SYS_MONITOR_STK_SIZE,
                (void*)NULL,
                (UBaseType_t)SYS_MONITOR_TASK_PRIO,
                (TaskHandle_t*)&SysMonitorTask_Handler);
    
    vTaskDelete(StartTask_Handler);   // 删除开始任务
    taskEXIT_CRITICAL();              // 退出临界区
}
